package pe.com.cotelasa.scp.dominio.servicio.impl;

import java.io.Serializable;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOCuentaBancaria;
import pe.com.cotelasa.scp.dominio.service.IServicioCuentaBancaria;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.ESTADO_RESULTADO;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.dominio.common.ResultadoValidacion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.entidad.CuentaBancaria;

/**
 * @author zer0
 */
@Service
public class ServicioCuentaBancariaImpl implements IServicioCuentaBancaria, Serializable {

    private static final long serialVersionUID = -3899534497036527682L;
    @Inject
    private IDAOCuentaBancaria daoCuentaBancaria;

    @Override
    public Collection<CuentaBancaria> listarCuentaBancariasActivas() throws ServiceException {
        try {
            return daoCuentaBancaria.listarActivos(CuentaBancaria.class);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<CuentaBancaria> listarTodasCuentaBancarias() throws ServiceException {
        try {
            return daoCuentaBancaria.listarTodos(CuentaBancaria.class);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public ResultadoValidacion validarCuentaBancaria(CuentaBancaria cuentaBancaria) throws ServiceException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public ResultadoServicio guardarCuentaBancaria(CuentaBancaria cuentaBancaria) throws ServiceException {
        ResultadoServicio resultadoServicio = new ResultadoServicio(ESTADO_RESULTADO.EXITOSO);
        try {
            //cuentaBancaria.setId(5);
            cuentaBancaria.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
            daoCuentaBancaria.insertar(cuentaBancaria);
        } catch (DAOException ex) {
            ex.printStackTrace();
            resultadoServicio.setEstadoResultado(ESTADO_RESULTADO.FALLIDO);
            resultadoServicio.setMensaje("Ocurrio un problema al tratar de guardar el cuentaBancaria.");
            Logger.getLogger(ServicioCuentaBancariaImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resultadoServicio;
    }

    @Override
    public CuentaBancaria conseguirCuentaBancariaPorId(Integer idCuentaBancaria) throws ServiceException {
        try {
            return daoCuentaBancaria.obtenerEntidadPorId(CuentaBancaria.class, idCuentaBancaria);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public ResultadoServicio actualizarCuentaBancaria(CuentaBancaria cuentaBancaria) throws ServiceException {
        ResultadoServicio resultadoServicio = new ResultadoServicio(ESTADO_RESULTADO.EXITOSO);
        try {
            daoCuentaBancaria.actualizar(cuentaBancaria);
        } catch (DAOException ex) {
            ex.printStackTrace();
            Logger.getLogger(ServicioCuentaBancariaImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resultadoServicio;
    }

    @Override
    public Collection<CuentaBancaria> listarCuentaBancariasPorFiltro(CuentaBancaria cuentaBancaria) throws ServiceException {
        try {
            Map<String, Object> parametro = new HashMap<String, Object>();
            parametro.put("numeroCuenta", cuentaBancaria.getNumeroCuenta());

            if (cuentaBancaria.getIdBanco().getId() != 0) {
                parametro.put("idBanco", cuentaBancaria.getIdBanco().getId());
            }
            if (cuentaBancaria.getIdTipoMoneda().getId() != 0) {
                parametro.put("idTipoMoneda", cuentaBancaria.getIdTipoMoneda().getId());
            }
            parametro.put("idEmpresa", cuentaBancaria.getIdEmpresa().getId());
            //parametro.put("idEmpresa", cuentaBancaria.getIdEmpresa().getId());
            parametro.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
            return daoCuentaBancaria.obtenerColeccionEntidadPorFiltros(CuentaBancaria.class, parametro);
        } catch (DAOException ex) {
            System.out.println("ERRORRRRRRRRRRRRRRRRRRRRR SERVICE");
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<CuentaBancaria> listarCuentaBancariasPorEmpresa(Integer idEmpresa) throws ServiceException {
        try {
            Map<String, Object> parametro = new HashMap<String, Object>();
            parametro.put("idEmpresa", idEmpresa);
            parametro.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
            return daoCuentaBancaria.obtenerColeccionEntidadPorFiltros(CuentaBancaria.class, parametro);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<CuentaBancaria> listarCuentaBancariasPorEmpresa(Integer idEmpresa, Integer idBanco) throws ServiceException {
        try {
            Map<String, Object> parametro = new HashMap<String, Object>();
            parametro.put("idEmpresa", idEmpresa);
            parametro.put("idBanco", idBanco);
            parametro.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
            return daoCuentaBancaria.obtenerColeccionEntidadPorFiltros(CuentaBancaria.class, parametro);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<CuentaBancaria> listaCuentaBancariaPorIdBanco(
            Integer idBanco) throws ServiceException {
        try {
            Map<String, Object> parametro = new HashMap<String, Object>();
            parametro.put("idBanco", idBanco);
            parametro.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
            return daoCuentaBancaria.obtenerColeccionEntidadPorFiltros(CuentaBancaria.class, parametro);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }
}
